#include "C_FSM.h"

/////////////////////////////////////////////////////////////////////////////
//	CONSTRUCTOR
/////////////////////////////////////////////////////////////////////////////
C_FSM::C_FSM()
{
	m_isChange = false;
	m_changeState = NULL;
}

/////////////////////////////////////////////////////////////////////////////
//	DESTRUCTOR
/////////////////////////////////////////////////////////////////////////////
C_FSM::~C_FSM()
{
}


/////////////////////////////////////////////////////////////////////////////
//	PUSH
/////////////////////////////////////////////////////////////////////////////
void C_FSM::push(VC_GameState* state)
{
	EX_R(state == NULL, "Cannon PUSH new state! Because state is equel NULL!")

	m_states.push(state);
}


/////////////////////////////////////////////////////////////////////////////
//	CHANGE
/////////////////////////////////////////////////////////////////////////////
void C_FSM::change(VC_GameState* state)
{
	EX_R(state == NULL, "Cannon CHANGE new state! Because state is equel NULL!")

	delete m_states.top();

	m_states.pop();
	m_states.push(state);
}


/////////////////////////////////////////////////////////////////////////////
//	POP
/////////////////////////////////////////////////////////////////////////////
void C_FSM::pop()
{
	EX_R(m_states.size() == 0, "Cannon POP for last state! Because size of stack is equel 0!")
	m_states.pop();
}

void C_FSM::handleEvent(sf::Event e)
{
	VC_Drawable::handleEvent(e);
	m_states.top()->handleEvent(e);
}

void C_FSM::render()
{
	m_states.top()->render();
}

void C_FSM::update()
{
	if (m_isChange && m_changeState != NULL)
	{
		m_isChange = false;
		this->change(m_changeState);
		m_changeState = NULL;
	}
	m_states.top()->update();
}
